package org.lanqiao.tjut.myUtils;

import java.io.File;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.BigDecimalConverter;
import org.apache.commons.beanutils.converters.ByteConverter;
import org.apache.commons.beanutils.converters.DoubleConverter;
import org.apache.commons.beanutils.converters.FloatConverter;
import org.apache.commons.beanutils.converters.IntegerConverter;
import org.apache.commons.beanutils.converters.LongConverter;
import org.apache.commons.beanutils.converters.ShortConverter;

public class MyUtils {
	public static <T> T convertRequest2Bean(HttpServletRequest request,Class<T> clazzBean,
			String fileUploadPath,String filePrefix){
		T tb=null;
		
		ConvertUtils.register(new DateTimeConverter(), Date.class);
		
		ConvertUtils.register(new ByteConverter(), Byte.class);
		ConvertUtils.register(new LongConverter(), Long.class);
		ConvertUtils.register(new FloatConverter(), Float.class);
		ConvertUtils.register(new ShortConverter(), Short.class);
		ConvertUtils.register(new IntegerConverter(), Integer.class);
		ConvertUtils.register(new DoubleConverter(), Double.class);
		ConvertUtils.register(new BigDecimalConverter(), BigDecimal.class);
		try {
			tb=clazzBean.newInstance();
			
			Enumeration<String> strPNames=request.getParameterNames();
			if(strPNames!=null){
				while(strPNames.hasMoreElements()){
				String pName=strPNames.nextElement();
				String pVale=request.getParameter(pName);
				BeanUtils.setProperty(tb, pName, pVale);
			}
			}
			
			
			if(request.getContentType()!=null&&request.getContentType().split(";")[0].equals("multipart/form-data")){
				Collection<Part> parts=request.getParts();
				
				for(Part part:parts){
					String pName=part.getName();
					String pContentType=part.getContentType();
					
					if(pContentType!=null&&!pContentType.equals("")&&part.getSize()>0){
					
						String strFileOldName=part.getSubmittedFileName();
						String realPath=request.getServletContext().getRealPath("/");
						
						
						File f=new File(realPath+fileUploadPath);
						if(!f.exists()){
							f.mkdirs();
						}
						System.out.println("打印上传目录："+f.getAbsolutePath());
						
						String strFileType=strFileOldName.substring(strFileOldName.lastIndexOf('.'));
						String strUploadFileName=filePrefix+"_"+UUID.randomUUID()+strFileType;
						part.write(realPath+fileUploadPath+strUploadFileName);
						BeanUtils.setProperty(tb, pName, fileUploadPath+strUploadFileName);
					}
				}
			}
		} catch (Exception e) {
			System.out.println("获取实体类异常"+e.getMessage());
			e.printStackTrace();
		}
		return tb;
	}
	public static Integer convertString2Integer(String strVal) {
		if (strVal == null || strVal.equals("")) {
			return null;
		} else {
			return Integer.valueOf(strVal);
		}
	}
	
	
	public static <T> T getNewInstance(Class<T> clazz){
		T t=null;
		try {
			t=clazz.newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("公用方法：实例化对象异常："+e.getMessage());
			e.printStackTrace();
			
		} 
		return t;
	}
	/**
	 * 将日期类型转为指定格式的字符串
	 * 
	 * @param date
	 *            被转换的日期类型
	 * @param strPattern
	 *            日期格式串
	 * @return 转换之后的字符串
	 * 
	 */
	public static String convertDate2String(Date date, String strPattern) {
		// 如果时间对象为null则，返回当前时间
		if (date == null) {
			date = new Date();
		}
		// 如果格式串为空则使用默认格式
		if (strPattern == null || strPattern.equals("")) {
			// 默认格式串
			strPattern = "yyyy-MM-dd HH:mm:ss";
		}
		// 创建一个日期对象转换类
		SimpleDateFormat sdf = new SimpleDateFormat(strPattern);
		// 返回转换之后的字符串
		return sdf.format(date);
	}


	/**
	 * 将指定格式的字符串转换为日期类型 (strPattern的格式表示是strDate的格式)
	 * 
	 * @param strDate
	 *            日期字符串
	 * @param strPattern
	 *            日期字符串的格式
	 * @return 转换之后的日期对象
	 */
	public static Date convertString2Date(String strDate, String strPattern) {
		// 如果时间对象为null则，返回当前时间


		if (strDate == null || strDate.equals("")) {
			return new Date();
		}
		// 如果格式串为空则使用默认格式
		if (strPattern == null || strPattern.equals("")) {
			// 默认格式串
			strPattern = "yyyy-MM-dd HH:mm:ss";
		}
		// 创建一个日期对象转换类
		SimpleDateFormat sdf = new SimpleDateFormat(strPattern);
		// 返回转换之后的时间对象
		Date date = null;
		try {
			date = sdf.parse(strDate);
		} catch (ParseException e) {
			// 公用方法：字符串转换日期对象异常：
			// logRootLogger.error("公用方法-字符串转换日期对象异常：" + e.getMessage());
			e.printStackTrace();
		}
		return date;
	}
}
